<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <script>
        //【1】将每个实例都有可能去更改的属性放到构造函数，而将几乎不会变动的方法以及constructor放在原型对象上。【这样我们更改每个实例的属性的时候，就不会影响到其他实例的属性】
        //这种构造函数与原型混成的模式，是目前在 ECMAScript 中使用最广泛、认同度最高的一种创建自
        // 定义类型的方法。可以说，这是用来定义引用类型的一种默认模式
        function Person(name, age, job) {
            this.name = name;
            this.age = age;
            this.job = job;
            this.friends = ["Shelby", "Court"];
        }
        Person.prototype = {
            constructor: Person,
            sayName: function() {
                console.log(this.name);
            }
        }
        var person1 = new Person("Nicholas", 29, "Software Engineer");
        var person2 = new Person("Greg", 27, "Doctor");
        person1.friends.push("Van");
        console.log(person1.friends); //"Shelby,Count,Van" 
        console.log(person2.friends); //"Shelby,Count" 
        console.log(person1.friends === person2.friends); //false 
        console.log(person1.sayName === person2.sayName); //true
    </script>
</body>

</html>